package manager.modulo.orcamento.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.estoque.enumerator.EnumUnidadeInsumo;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class OrcamentoDao implements InterfaceDao {

    private int id;
    private String objeto;
    private String identificador;
    private int valorCalculado;
    private int idClienteFornecedor;
    private Timestamp dtOrcamento;

    /**
     * Inicializando as variáveis
     */
    public OrcamentoDao() {
        objeto = "";
        identificador = "";
        valorCalculado = 0;
        idClienteFornecedor = 0;
        dtOrcamento = new Timestamp(00 - 00 - 00);
    }

    public static int getIdOrcamentoPorIdentificador(String codigo) {
        try {

            String sql = "SELECT id FROM orcamento WHERE tx_identificador = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, codigo);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Orçamentos");
            return 0;
        }
    }

    public LinkedList<String> buscar(String opcao, String palavraBuscada, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Identificador")) {
                sql = "SELECT tx_identificador FROM orcamento WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Cliente/Fornecedor")) {
                sql = "SELECT tx_identificador FROM cliente_fornecedor WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscarTabela(String opcao, String palavraBuscada) throws SQLException {
        LinkedList result = new LinkedList();
        if (!palavraBuscada.equals("")) {
            String sql = "";
           if (opcao.equalsIgnoreCase("Identificador")) {
                sql = "SELECT "
                        + " o.id as IdOrcamento,"
                        + " o.tx_identificador as Identificador,"
                        + " cf.tx_identificador as ClienteFornecedor,"
                        + " o.nm_valor_calculado as ValorCalculado "
                        + "FROM "
                        + " orcamento o "
                        + "INNER JOIN cliente_fornecedor cf ON cf.id = o.id_cliente_fornecedor "
                        + "WHERE "
                        + " o.tx_identificador LIKE ? "
                        + "ORDER BY o.tx_identificador ";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Cliente/Fornecedor")) {
                sql = "SELECT "
                        + " o.id as IdOrcamento,"
                        + " o.tx_identificador as Identificador,"
                        + " cf.tx_identificador as ClienteFornecedor,"
                        + " o.nm_valor_calculado as ValorCalculado "
                        + "FROM "
                        + " orcamento o "
                        + "INNER JOIN cliente_fornecedor cf ON cf.id = o.id_cliente_fornecedor "
                        + "WHERE "
                        + " cf.tx_identificador LIKE ? "
                        + "ORDER BY cf.tx_identificador ";
                palavraBuscada += "%";
            }

            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> colunaIdentificador = new LinkedList<String>();
                LinkedList<String> colunaClienteFornecedor = new LinkedList<String>();
                LinkedList<String> colunaValorUnitario = new LinkedList<String>();
                LinkedList<Integer> colunaId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    colunaId.add(resultSet.getInt("IdOrcamento"));
                    colunaIdentificador.add(resultSet.getString("Identificador"));
                    colunaClienteFornecedor.add(resultSet.getString("ClienteFornecedor"));
                    colunaValorUnitario.add(Format.formatarMonetario(Double.toString((resultSet.getDouble("ValorCalculado")) / 100)));
                }

                result.add(colunaId);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
                result.add(colunaIdentificador);
                result.add(colunaClienteFornecedor);
                result.add(colunaValorUnitario);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM orcamento WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                objeto = resultSet.getString("tx_objeto");
                identificador = resultSet.getString("tx_identificador");
                valorCalculado = resultSet.getInt("nm_valor_calculado");
                idClienteFornecedor = resultSet.getInt("id_cliente_fornecedor");
                dtOrcamento = resultSet.getTimestamp("dt_orcamento");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Orçamentos");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {

        String sql = "INSERT INTO orcamento "
                + "(tx_identificador,"
                + " tx_objeto,"
                + " nm_valor_calculado,"
                + " id_cliente_fornecedor,"
                + " dt_orcamento) "
                + "VALUES ("
                + "?," // 01 Identificador
                + "?," // 02 Objeto
                + "?," // 03 Valor Calculado
                + "?," // 04 Cliente Fornecedor
                + "?)"; // 05 Dt Orcamento
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, objeto);
        preparedStatement.setInt(3, valorCalculado);
        preparedStatement.setInt(4, idClienteFornecedor);
        preparedStatement.setTimestamp(5, dtOrcamento);

        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "  UPDATE orcamento SET "
                + "     tx_identificador = ? ," // 01
                + "     tx_objeto = ? ," // 02
                + "     nm_valor_calculado = ? ," // 03
                + "     id_cliente_fornecedor = ? ," // 04
                + "     dt_orcamento = ? " // 05
                + " WHERE "
                + "     id = ?";             // 11
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, objeto);
        preparedStatement.setInt(3, valorCalculado);
        preparedStatement.setInt(4, idClienteFornecedor);
        preparedStatement.setTimestamp(5, dtOrcamento);
        preparedStatement.setInt(6, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getObjeto() {
        return objeto;
    }

    public void setObjeto(String objeto) {
        this.objeto = objeto;
    }

    public String getIdentificador() {
        return identificador;
    }

    public void setIdentificador(String identificador) {
        this.identificador = identificador;
    }

    public int getValorCalculado() {
        return valorCalculado;
    }

    public void setValorCalculado(int valorCalculado) {
        this.valorCalculado = valorCalculado;
    }

    public int getIdClienteFornecedor() {
        return idClienteFornecedor;
    }

    public void setIdClienteFornecedor(int idClienteFornecedor) {
        this.idClienteFornecedor = idClienteFornecedor;
    }

    public Timestamp getDtOrcamento() {
        return dtOrcamento;
    }

    public void setDtOrcamento(Timestamp dtOrcamento) {
        this.dtOrcamento = dtOrcamento;
    }
}
